import os
import re
from PIL import Image

def adjust_image_width(image_path):
    """
    调整图片宽度为偶数（如果是奇数的话）
    
    Args:
        image_path: 图片文件路径
    
    Returns:
        tuple: (是否修改, 原始尺寸, 新尺寸)
    """
    try:
        # 打开图片
        with Image.open(image_path) as img:
            width, height = img.size
            
            # 检查宽度是否为奇数
            if width % 2 == 1:
                # 计算新的宽度（加1）
                new_width = width + 1
                # 调整图片大小
                new_img = img.resize((new_width, height), Image.Resampling.LANCZOS)
                # 保存图片（覆盖原文件）
                new_img.save(image_path, format=img.format, quality='keep')
                return True, (width, height), (new_width, height)
            
            return False, (width, height), (width, height)
            
    except Exception as e:
        print(f"处理图片 {image_path} 时出错: {str(e)}")
        return False, None, None

def rename_to_standard_format(file_path):
    """
    将文件重命名为标准格式（an.png，其中n是0-9的数字）
    处理以下格式：
    - 2.png -> a2.png
    - 2(1).png 或 2（1）.png -> a2.png
    - a5(1).png 或 a5（1）.png -> a5.png
    - b2(1).png -> a2.png
    - h5.png -> a5.png
    
    Args:
        file_path: 原始文件路径
    
    Returns:
        tuple: (是否重命名, 新文件名)
    """
    try:
        # 获取文件名和目录
        directory = os.path.dirname(file_path)
        filename = os.path.basename(file_path)
        
        # 如果文件名已经是正确格式，不需要重命名
        if re.match(r'^a[0-9]\.png$', filename):
            return False, filename
            
        # 尝试匹配以下模式：
        # 1. 任意字母开头（可选）后跟数字：b2(1).png, h5.png
        # 2. 数字后跟任意字符：2(1).png, 5_test.png
        # 3. a开头数字：a5.png
        match = re.match(r'[a-zA-Z]*(\d+).*\.png$', filename)
        if match:
            # 提取括号前的数字
            number = int(match.group(1))
            if number < 0 or number > 9:
                return False, filename
                
            # 构造新文件名
            new_filename = f"a{number}.png"
            new_path = os.path.join(directory, new_filename)
            
            # 如果文件名已经是正确格式，不需要重命名
            if filename == new_filename:
                return False, filename
                
            # 如果目标文件已存在，先删除它
            if os.path.exists(new_path) and file_path.lower() != new_path.lower():
                os.remove(new_path)
                
            # 重命名文件
            if file_path.lower() != new_path.lower():
                os.rename(file_path, new_path)
                return True, new_filename
                
        return False, filename
        
    except Exception as e:
        print(f"重命名文件 {file_path} 时出错: {str(e)}")
        return False, os.path.basename(file_path)

def process_directory(directory, root_dir=None):
    """
    处理指定目录及其子目录中的所有PNG文件
    
    Args:
        directory: 要处理的目录
        root_dir: 根目录，用于计算相对路径
    
    Returns:
        tuple: (重命名文件数, 修改尺寸文件数)
    """
    if root_dir is None:
        root_dir = directory
        
    renamed_count = 0
    modified_count = 0
    total_png_count = 0
    
    # 递归遍历目录
    for root, _, files in os.walk(directory):
        # 获取当前目录中的所有PNG文件
        png_files = [f for f in files if f.lower().endswith('.png')]
        total_png_count += len(png_files)
        
        if png_files:
            # 计算相对路径（用于显示）
            rel_path = os.path.relpath(root, root_dir)
            if rel_path == '.':
                path_prefix = ""
            else:
                path_prefix = f"{rel_path}\\"
            
            # 首先处理文件重命名
            processed_files = []
            for png_file in png_files:
                file_path = os.path.join(root, png_file)
                renamed, new_filename = rename_to_standard_format(file_path)
                if renamed:
                    renamed_count += 1
                    print(f"已重命名: {path_prefix}{png_file} -> {new_filename}")
                processed_files.append(new_filename)
            
            # 然后处理图片尺寸
            for png_file in processed_files:
                file_path = os.path.join(root, png_file)
                modified, old_size, new_size = adjust_image_width(file_path)
                
                if modified:
                    modified_count += 1
                    print(f"已修改 {path_prefix}{png_file}: {old_size[0]}x{old_size[1]} -> {new_size[0]}x{new_size[1]}")
                else:
                    if old_size:  # 如果处理成功但没有修改
                        print(f"无需修改 {path_prefix}{png_file}: {old_size[0]}x{old_size[1]}")
    
    return renamed_count, modified_count, total_png_count

def main():
    # 获取当前目录
    current_dir = os.getcwd()
    
    print("开始处理PNG文件（包括子目录）...")
    renamed_count, modified_count, total_png_count = process_directory(current_dir)
    
    if total_png_count == 0:
        print("没有找到PNG文件")
        return
    
    print(f"\n处理完成:")
    print(f"- 找到PNG文件总数: {total_png_count}")
    print(f"- 重命名文件数: {renamed_count}")
    print(f"- 修改尺寸文件数: {modified_count}")

if __name__ == "__main__":
    main()